WICS−2000 COMPILER Ver.2.0 ――――――――――――――――――――――――――――――――――――――― I/O 1983年 6月号掲載 MZ−2000 マシン語  0D000H−0EFFFH S:0D000H 起動方法 WICSを起動 LOAD ――――――――――――――――――――――――――――――――――――――― 遅くなりましたがWICSコンパイラを発表します。 WICSコンパイラ自身はWICSで書かれていますが、 今回はコンパイル・オブジェクトのみの発表とさせていただきます。 I/O誌’82年6月号には MZ−80B用WICSコンパイラのソース・リストが発表されているので、 コンパイラ自身についての詳細はそちらのほうを参照してください。 ・―――――――――――――――――・ |::::::コンパイラの入力方法::::::::| ・―――――――――――――――――・ コンパイル・オブジェクトのダンプ・リスト(リスト1)を MONITOR TS−2000から打ち込んでください。 ・―――――――――――――――――・ |::::::::コンパイラの使用法::::::::| ・―――――――――――――――――・ MONITOR TS−2000から WICSインタープリタ(ランタイムを含んでいます)を ロードしてください。 次にソース・プログラムをロードし、 それからコンパイラをロードしてください。 コンパイラが起動すると、タイトルが表示された後、 (1)Source Program:(ソース・プログラムの開始番地) (2)Object Program:(オブジェクト・プログラム格納番地) (3)Work area :(コンパイラのワーク・エリア指定) の3つの番地を聞いてくるので、それぞれ入力してください。 (4)Address Table(Y/N):(アドレス表の表示の如何) (5)Pass(2/4) :(2PASSか4PASSかの選択) の2つに対しては[CR]キーを押すと自動的に[N]、[4]が指定されます。 (1)は通常の場合$4800でよいのですが、TEXTコマンドで   ソース・プログラムを違う番地に置いている場合は、   その番地を入力しなければなりません   (SYSTEMコマンドで確認してください)。 (2)は生成されるオブジェクトの格納番地ですから、   空き工リア上に適当に与えてください(たとえば$8000など)。 (3)はコンパイラのワーク・エリアで、   行番号テーブル、変数テーブルの作成に必ず必要です   (大きさの目安は10Kのソースで約2K程度)。   通常は、インタープリタ内のワーク・エリア($3C00)を   指定すれば充分です。   このワーク・エリアはコンパイル時のみ必要で、   生成されたオブジェクトでは必要としません。 (4)で[Y]を選択するとPass2またはPass4のときに   行番号:番地−番地というように   ソース・プログラムの行番号に対応したオブジェクト番地が   表示されていきます。 (5)2PASSではジャンプ命令はすべて絶対ジャンプです。   4PASSを選ぶと相対ジャンプでとどく場合は   相対ジャンプになり、プログラム・サイズを縮めることができます。   コンパイルが無事終了すると   オブジェクトの大きさと番地、変数表が順に表示されます。   ソース・プログラムにエラーがあると、   エラーメッセージを出してコンパイルを中止します。   ただし、最初の番地指定にミスがあると正しい動作は得られません。   ソースとオブジェクトが重なったり   ワーク・エリアがプログラムと重なったりしないように、   メモリ配置に気をつけてください。   こうして生成されたオブジェクト・プログラムは   WICSランタイム・パッケージにのみ依存し、   インタープリンタおよびコンパイラを必要としなくなります。 ・―――――――――――――――――・ |::::独立型オブジェクトの生成::::::| ・―――――――――――――――――・ オブジェクト・プログラムを$2700番地から生成し、 $1500〜$26FFのランタイム.パッケージとまとめて MONITOR TS−2000でセーブすれば、 MONITOR TS−2000からロードしただけで走る 独立型オブジェクトになります。 このときオート・スタート番地は$2700よりも $1500番地としたほうが良いでしょう (スタックなどの初期化を行ない、  $2700番地へ飛ぶようになっています)。 ・―――――――――――――――――・ |::::IPLからのオート・ロード::::| ・―――――――――――――――――・ MONITORTS−2000から、 もう一度MONITOR TS−2000をロードします。 $8000〜$94FF番地にロードされると思います。 次にスクリーン・エディットて以下のような変更を加えてください。 終わったら、別のテープに$8000〜$94FFをセーブし、 直後に先ほどの独立型オブジェクトをセーブしてください。 以上でこのテープをIPLからロードするだけで、 WICSコンパイル・オブジェクトがTS−2000から 自動的にロードされ走るようになります。 ・―――――――――――――――――・ | 80F0 C3 80 13 | | | | 9380 EF 1E EF 10 DA F0 13 EF | | 9388 26 4C 6F 61 64 69 6E 67 | | 9390 20 0O EF 2C EF 11 DA F0 | | 9398 13 CD A0 13 C3 00 15 00 | | 93A0 3E 01 32 F0 00 C9 00 00 | | | | 93F0 CD A0 13 C3 F0 00 00 00 | ・―――――――――――――――――・ ・―――――――――――――――――・ |::::::::::::::最後に::::::::::::::| ・―――――――――――――――――・ 以上でMZ−2000システム・ソフトの発表は終りです。 すべてダンプ・リストのみという形ですが、 少しでもユーザーのみなさんのお役に立てれば幸いに思います。 一人でも多くのユーザーがBASEなりWICSなりで プログラムを完成できるようになることが私達の願いです。 【】参考文献 1)“Color WICS−2000マニュアル”、キャリーラボ ・―――――――――――――――――・ |::::::::::::::追::記::::::::::::::| ・―――――――――――――――――・ サンプルプログラムとして超巨大3次元迷路を載せます(リスト2)。 インタープリタより打ち込んだのち、一応セーブして、 ・―――――――――――――――――・ |  Object Program:$8000     | |  Work area :$F000     | ・―――――――――――――――――・ ぐらいでコンパイルしてください。 迷路サイズは640×200、迷路作成にかかる時間は3分40秒程です。 作ってから未だ抜け出た人は、一人もいません。 また、チェックサム・プログラムはご質問の多い モニタ・コールの使用例として、アセンブル・リストで載せます。 ■■■■■■■■■■■リスト  チェック・サム・プログラム■■■■■■■■■■ 0000 1 0000 2 ; 0000 3 ; 0000 4 ; Checksum Program for TS-2000 0000 5 ; 0000 6 ; by Y.Yuki 0000 7 0000 8 A000 9 START $A000 A000 10 A000 11 PUTCHR. EQU $03EF A000 12 CRLF. EQU $07EF A000 13 SPACE. EQU $09EF A000 14 GETCH. EQU $0AEF A000 15 INKEY. EQU $0CEF A000 16 PRHL. EQU $19EF A000 17 PRA. EQU $1AEF A000 18 RDHEX4. EQU $1BEF A000 19 ZPRC. EQU $26EF A000 20 ZPR. EQU $27EF A000 21 ZINP. EQU $2FEF A000 22 ; A000 23 PRMODE EQU $0036 A000 24 MONIT EQU $00F0 A000 25 A000 26 ; A000 27 ; A000 28 ;----- USER INPUT A000 29 A000 EF 27 0C 06 3E 3E 30 'ZPR. !(0C06">>> CHECK SUM"0D0D00) ;80CHR A006 3E 20 20 43 48 45 A00C 43 4B 20 53 55 4D A012 0D 0D 00 A015 EF 2F 46 52 4F 4D 31 'ZINP. !("FROM :"00) A01B 20 3A 00 A01E EF 1B DA F0 00 32 'RDHEX4. IF CY GOTO MONIT A023 33 A023 EF 26 0D 50 52 49 34 'ZPRC. !(0D"PRINTER? (Y/N)"00) A029 4E 54 45 52 3F 20 A02F 28 59 2F 4E 29 00 A035 EF 0A 35 'GETCH. A037 FE 59 20 05 3E 02 36 IF A="Y" THEN A=2 (PRMODE)=A A03D 32 36 00 A040 EF 07 EF 07 37 'CRLF. 'CRLF. A044 38 ; A044 39 ;----- MAIN ROUTINE A044 40 A044 11 EF A0 41 DE=STORE-1 A047 42 A047 43 MAINLOOP A047 EF 27 0D 41 64 64 44 'ZPR. !(0D"Add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Sum"0D00) A04D 20 20 2B 30 20 2B A053 31 20 2B 32 20 2B A059 33 20 2B 34 20 2B A05F 35 20 2B 36 20 2B A065 37 20 2B 38 20 2B A06B 39 20 2B 41 20 2B A071 42 20 2B 43 20 2B A077 44 20 2B 45 20 2B A07D 46 20 53 75 6D 0D A083 00 A084 45 ; A084 46 LOOP1 A084 EF 19 47 'PRHL. A086 01 00 10 48 BC=$1000 A089 49 LOOP2 A089 EF 09 50 'SPACE. A08B 7E EF 1A 7E 81 4F 51 A=(HL) 'PRA. A=(HL) A=A+C C=A A091 7E 23 52 A=(HL+) A093 E5 26 00 68 19 86 53 [HL H=0 L=B HL=HL+DE A=A+(HL) (HL)=A ]HL A099 77 E1 A09B 10 EC 54 DJNZ LOOP2 A09D EF 27 20 3A 00 55 'ZPR. !(" :"00) A0A2 79 EF 1A EF 07 56 A=C 'PRA. 'CRLF. A0A7 2C 2D 20 D9 57 IF L<>0 GOTO LOOP1 A0AB 58 ; A0AB 06 38 59 DO B=56 A0AD 3E 2D EF 03 60 A="-" 'PUTCHR. A0B1 10 FA 61 UNTIL DEC(B)=0 A0B3 62 ; A0B3 EF 27 0D 53 75 6D 63 'ZPR. !(0D"Sum "00) A0B9 20 20 00 A0BC E5 64 [HL A0BD 21 FF A0 01 00 10 65 HL=STORE+15 BC=$1000 A0C3 66 LOOP3 A0C3 7E EF 1A EF 09 67 A=(HL) 'PRA. 'SPACE. A0C8 79 86 4F 36 00 2B 68 A=C A=A+(HL) C=A (HL)=0 HL- A0CE 10 F3 69 DJNZ LOOP3 A0D0 3E 3A EF 03 79 EF 70 A=":" 'PUTCHR. A=C 'PRA. A0D6 1A A0D7 E1 71 ]HL A0D8 EF 07 72 'CRLF. A0DA 73 ; A0DA EF 0C 74 'INKEY. A0DC FE 20 20 02 EF 0A 75 IF A=" " THEN 'GETCH. A0E2 FE 1B 20 07 AF 32 76 IF A=$1B THEN A=0 (PRMODE)=A GOTO MONIT A0E8 36 00 C3 F0 00 A0ED 77 ; A0ED C3 47 A0 78 GOTO MAINLOOP A0F0 79 A0F0 80 ; A0F0 81 ;----- WORK AREA A0F0 82 A0F0 00 00 00 00 00 00 83 STORE DEFS 16 A0F6 00 00 00 00 00 00 A0FC 00 00 00 00 A100 84 A100 85 A100 86 A100 87 A100 88 *Object end:A100